home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / WINDOWS / GVECTS.ZIP / APPMAIN.CPP next >
Encoding:
C/C++ Source or Header  |  1996-11-07  |  7.9 KB  |  335 lines

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include "appmain.h"
  5. #include "hscreen.h"
  6.  
  7. typedef struct
  8. {
  9.     float x, y, z;
  10. } VECTOR;
  11.  
  12. HDC                MainDC;
  13. WINAPP            WinApp;
  14. BYTE            *hmap;
  15. BYTE            *vmap;
  16. BYTE            *tmap;
  17. HIDDEN_SCREEN    *hScreen;
  18. static HPALETTE    Pal;
  19. VECTOR            Light;
  20. int GetLine(char *buff, int n, FILE *in);
  21.  
  22. void SetGrayPalette();
  23. void ShowHMAP();
  24. void GenerateVectors();
  25. VECTOR CrossProduct(VECTOR v1, VECTOR v2);
  26. float DotProduct(VECTOR v1, VECTOR v2);
  27. void Normalize(VECTOR *v1);
  28.  
  29. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR cmdString, int cmdShow)
  30. {
  31.     HWND        MainWnd;
  32.     MSG         msg;
  33.     WNDCLASS    WndClass;
  34.     HMENU       hMenu;
  35.  
  36.     WinApp.hInstance = hInstance;
  37.     WinApp.hPrevInst = hPrevInst;
  38.     WinApp.cmdShow   = cmdShow;
  39.  
  40.     WndClass.style          = CS_HREDRAW | CS_VREDRAW;
  41.     WndClass.lpfnWndProc    = WndProc;
  42.     WndClass.cbClsExtra     = 0;
  43.     WndClass.cbWndExtra     = 0;
  44.     WndClass.hInstance      = hInstance;
  45.     WndClass.hIcon          = LoadIcon(WinApp.hInstance, "GOURAUD");
  46.     WndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  47.     WndClass.hbrBackground  = (HBRUSH)(GetStockObject(GRAY_BRUSH));
  48.     WndClass.lpszMenuName   = NULL;
  49.     WndClass.lpszClassName  = "MAINWND";
  50.     RegisterClass(&WndClass);
  51.  
  52.     hMenu = LoadMenu(WinApp.hInstance, "MAINMENU");
  53.     MainWnd   = CreateWindow("MAINWND", "Gouraud Vectors",
  54.                              WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU,
  55.                              0, 0, 256, 256,
  56.                              NULL, hMenu, hInstance, NULL);
  57.     AdjustClientRegion(MainWnd, 0, 0, 256, 256);
  58.     ShowWindow(MainWnd, WinApp.cmdShow);
  59.     UpdateWindow(MainWnd);
  60.  
  61.     for (;;)
  62.     {
  63.         if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  64.         {
  65.             if(msg.message == WM_QUIT)
  66.                 break;
  67.             TranslateMessage(&msg);
  68.             DispatchMessage(&msg);
  69.         }
  70.         else
  71.         {
  72.                 WaitMessage();
  73.         }
  74.     }
  75.     return 0;
  76. };
  77.  
  78. LRESULT CALLBACK WndProc(HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam)
  79. {
  80.     FILE *fp;
  81.     PAINTSTRUCT ps;
  82.     char buf[120];
  83.         
  84.     switch(message)
  85.     {
  86.         case WM_CREATE:
  87.             hmap = new BYTE[65536];
  88.             vmap = new BYTE[65536];
  89.             tmap = new BYTE[255 * 255 * 2];
  90.             fp = fopen("hmap.raw", "rb");
  91.             fread(hmap, sizeof(BYTE), 65536, fp);
  92.             fclose(fp);
  93.             MainDC = GetDC(hWindow);
  94.             SetSystemPaletteUse(MainDC, SYSPAL_NOSTATIC);
  95.             SetSystemPaletteUse(MainDC, SYSPAL_STATIC);
  96.             SetGrayPalette();
  97.             hScreen = new HIDDEN_SCREEN(MainDC, 256, 256);
  98.             hScreen->UseDCPal(MainDC);
  99.             ShowHMAP();
  100.             fp = fopen("options.ini", "rt");
  101.             GetLine(buf, 100, fp);
  102.             sscanf(buf, "%f %f %f", &Light.x, &Light.y, &Light.z);
  103.             fclose(fp);
  104.             Normalize(&Light);
  105.             return 0;
  106.         case WM_PAINT:
  107.             BeginPaint(hWindow, &ps);
  108.             SetSystemPaletteUse(MainDC, SYSPAL_NOSTATIC);
  109.             SetSystemPaletteUse(MainDC, SYSPAL_STATIC);
  110.             SetGrayPalette();
  111.             hScreen->BltToScreen(MainDC, 0, 0);
  112.             EndPaint(hWindow, &ps);
  113.             return 0;
  114.         case WM_LBUTTONDOWN:
  115.             GenerateVectors();
  116.             fp = fopen("gvects.vec", "wb");
  117.             fwrite(vmap, sizeof(BYTE), 65536, fp);
  118.             fclose(fp);
  119.             return 0;
  120.         case WM_COMMAND:
  121.             switch(wParam)
  122.             {
  123.                 case 101:
  124.                     SendMessage(hWindow, WM_DESTROY, 0, 0L);
  125.                     return 0;
  126.             }
  127.             return(DefWindowProc(hWindow, message, wParam, lParam));
  128.         case WM_DESTROY:
  129.             ReleaseDC(hWindow, MainDC);
  130.             delete hScreen;
  131.             delete hmap;
  132.             delete vmap;
  133.             delete tmap;
  134.             PostQuitMessage(0);
  135.             return 0;
  136.         default:
  137.             return(DefWindowProc(hWindow, message, wParam, lParam));
  138.     }
  139. };
  140.  
  141. void SetGrayPalette()
  142. {
  143.     NPLOGPALETTE Palette;
  144.  
  145.     Palette = (NPLOGPALETTE)LocalAlloc(LMEM_FIXED,
  146.         (sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * (256))));
  147.     Palette->palVersion = 0x300;
  148.     Palette->palNumEntries = 256;
  149.  
  150.     for(int i = 0; i < 256; i++)
  151.     {
  152.         Palette->palPalEntry[i].peRed = (BYTE)i;
  153.         Palette->palPalEntry[i].peGreen = (BYTE)i;
  154.         Palette->palPalEntry[i].peBlue = (BYTE)i;
  155.         Palette->palPalEntry[i].peFlags = (BYTE)PC_RESERVED;
  156.     }
  157.  
  158.     Pal = CreatePalette((LPLOGPALETTE)Palette);
  159.     LocalFree((NPLOGPALETTE)Palette);
  160.     SelectPalette(MainDC, Pal, FALSE);
  161.     RealizePalette(MainDC);
  162. };
  163.  
  164. void ShowHMAP()
  165. {
  166.     int i, j;
  167.     char *screen;
  168.     
  169.     screen = (char *)hScreen->Surface;
  170.     for(i = 0; i < 256; i++)
  171.         for(j = 0; j < 256; j++)
  172.             *screen++ = ((hmap[(i << 8) + j] * 236) >> 8) + 10;
  173. };
  174.  
  175. void GenerateVectors()
  176. {
  177.     VECTOR v1, v2, v3, tmp1, tmp2, norm;
  178.     int i, j;
  179.     float illum;
  180.     long in;
  181.     char *c;
  182.     FILE *fp;
  183.                     
  184.     c = (char *)hScreen->Surface;
  185.     for(i = 0; i < 255; i++)
  186.     {
  187.         for(j = 0; j < 255; j++)
  188.         {
  189.             v1.x = (float)(j << 10);
  190.             v1.z = (float)(i << 10);
  191.             v1.y = (float)(hmap[(i << 8) + j] * -50);
  192.             v2.x = (float)((j + 1) << 10);
  193.             v2.z = (float)(i << 10);
  194.             v2.y = (float)(hmap[(i << 8) + j + 1] * -50);
  195.             v3.x = (float)(j << 10);
  196.             v3.z = (float)((i + 1) << 10);
  197.             v3.y = (float)(hmap[((i + 1) << 8) + j] * -50);
  198.             tmp1.x = v2.x - v1.x;
  199.             tmp1.y = v2.y - v1.y;
  200.             tmp1.z = v2.z - v1.z;
  201.             tmp2.x = v3.x - v1.x;
  202.             tmp2.y = v3.y - v1.y;
  203.             tmp2.z = v3.z - v1.z;
  204.             norm = CrossProduct(tmp1, tmp2);
  205.             Normalize(&norm);
  206.             illum = DotProduct(norm, Light);
  207.             if(illum < 0) illum = 0;
  208.             if(illum >= 1.0) illum = 1.0;
  209.             in = (long)(illum * 33);
  210.             if(in > 32) in = 32;
  211.             if(in < 0) in = 0;
  212.             tmap[(i << 1) * 255 + (j << 1)] = (BYTE)in;
  213.  
  214.             v1.x = (float)(j << 10);
  215.             v1.z = (float)((i + 1) << 10);
  216.             v1.y = (float)(hmap[((i + 1) << 8) + j] * -50);
  217.             v2.x = (float)((j + 1) << 10);
  218.             v2.z = (float)(i << 10);
  219.             v2.y = (float)(hmap[(i << 8) + j + 1] * -50);
  220.             v3.x = (float)((j + 1) << 10);
  221.             v3.z = (float)((i + 1) << 10);
  222.             v3.y = (float)(hmap[((i + 1) << 8) + j + 1] * -50);
  223.             tmp1.x = v2.x - v1.x;
  224.             tmp1.y = v2.y - v1.y;
  225.             tmp1.z = v2.z - v1.z;
  226.             tmp2.x = v3.x - v1.x;
  227.             tmp2.y = v3.y - v1.y;
  228.             tmp2.z = v3.z - v1.z;
  229.             norm = CrossProduct(tmp1, tmp2);
  230.             Normalize(&norm);
  231.             illum = DotProduct(norm, Light);
  232.             if(illum < 0) illum = 0;
  233.             if(illum >= 1.0) illum = 1.0;
  234.             in = (long)(illum * 33);
  235.             if(in > 32) in = 32;
  236.             if(in < 0) in = 0;
  237.             tmap[(i << 1) * 255 + (j << 1) + 1] = (BYTE)in;
  238.         }
  239.         memset(c, 254, 256);
  240.         c += 256;
  241.         hScreen->BltToScreen(MainDC, 0, 0);
  242.     }
  243.     ShowHMAP();
  244.     hScreen->BltToScreen(MainDC, 0, 0);
  245.     int ave;
  246.     int m, n;
  247.     c = (char *)hScreen->Surface;
  248.     for(i = 0; i < 256; i++)
  249.     {
  250.         for(j = 0; j < 256; j++)
  251.         {
  252.             ave = 0;
  253.             m = j - 1;
  254.             if(m < 0) m = 0;
  255.             n = i - 1;
  256.             if(n < 0) n = 0;
  257.             ave += tmap[(n << 1) * 255 + (m << 1) + 1];
  258.             m = j;
  259.             if(m > 254) m = 254;
  260.             ave += tmap[(n << 1) * 255 + (m << 1)];
  261.             ave += tmap[(n << 1) * 255 + (m << 1) + 1];
  262.             m = j - 1;
  263.             if(m < 0) m = 0;
  264.             n = i;
  265.             if(n > 254) n = 254;
  266.             ave += tmap[(n << 1) * 255 + (m << 1)];
  267.             ave += tmap[(n << 1) * 255 + (m << 1) + 1];
  268.             m = j;
  269.             if(m > 254) m = 254;
  270.             n = i;
  271.             if(n > 254) n = 254;
  272.             ave += tmap[(n << 1) * 255 + (m << 1)];
  273.             ave /= 6;
  274.             if(ave < 0) ave = 0;
  275.             if(ave > 32) ave = 32;
  276.             vmap[(i << 8) + j] = ave;
  277.         }
  278.         memset(c, 250, 256);
  279.         c += 256;
  280.         hScreen->BltToScreen(MainDC, 0, 0);
  281.     }
  282.     ShowHMAP();
  283.     hScreen->BltToScreen(MainDC, 0, 0);
  284. };
  285.  
  286. VECTOR CrossProduct(VECTOR v1, VECTOR v2)
  287. {
  288.     VECTOR res;
  289.  
  290.     res.x = (v1.y * v2.z) - (v1.z * v2.y);
  291.     res.y = (v1.z * v2.x) - (v1.x * v2.z);
  292.     res.z = (v1.x * v2.y) - (v1.y * v2.x);
  293.  
  294.     return(res);
  295. };
  296.  
  297. float DotProduct(VECTOR v1, VECTOR v2)
  298. {
  299.     return((v1.x * v2.x) +
  300.            (v1.y * v2.y) +
  301.            (v1.z * v2.z));
  302. };
  303.  
  304. void Normalize(VECTOR *v1)
  305. {
  306.     float length;
  307.     length = sqrt((v1->x * v1->x)
  308.                 + (v1->y * v1->y)
  309.                 + (v1->z * v1->z));
  310.  
  311.     length = 1.0 / length;
  312.     v1->x = v1->x * length;
  313.     v1->y = v1->y * length;
  314.     v1->z = v1->z * length;
  315. };
  316.  
  317. int GetLine(char *buff, int n, FILE *in)
  318. {
  319.     char *p;
  320.  
  321.     do
  322.     {
  323.         if (fgets(buff, n, in) == 0)
  324.             return -1;
  325.         if ((p = strchr(buff, '\n')) != NULL)
  326.             *p = '\0';
  327.         if ((p = strchr(buff, ';')) != NULL)
  328.             *p = '\0';
  329.         for (p = buff; isspace(*p); ++p);
  330.     } while (p[0] == '\0');
  331.  
  332.     return 0;
  333. };
  334.  
  335.